package com.adwyxx.type;

import java.lang.reflect.*;

/**
 * 泛型数组类型 {@link GenericArrayType}
 * 获得这个数组元素类型，即获得：A<T>（A<T>[]）或T（T[]）
 * 描述的是 {@link ParameterizedType} 类型以及 {@link TypeVariable} 类型数组，即形如：classA<T>[][]、T[]等，是Type的子接口。
 * GenericArrayType 接口方法：
 * Type[] getGenericComponentType() 方法：
 * 获取泛型数组中元素的类型，要注意的是：无论从左向右有几个[]并列，这个方法仅仅脱去最右边的[]之后剩下的内容就作为这个方法的返回值。
 *
 * @author Leo
 * @date 2024/8/20 15:10
 */
public class GenericArrayTypeDemo<T> {
    T[] values;

    public static <E> E[][] test() {
        return null;
    }

    public static void main(String[] args) throws NoSuchFieldException, NoSuchMethodException {
        Class clazz = GenericArrayTypeDemo.class;
        Field field = clazz.getDeclaredField("values");
        GenericArrayType gtype = (GenericArrayType) field.getGenericType();
        System.out.println("GenericArrayType -> " + gtype); // T[]
        System.out.println("GenericArrayType -> GenericComponentType -> " + gtype.getGenericComponentType()); // T
        System.out.println();

        Method method = clazz.getMethod("test");
        System.out.println("ReturnType -> " + method.getReturnType()); //  class [[Ljava.lang.Object;
        // 获取返回值的泛型信息：
        Type returntType = method.getGenericReturnType();
        System.out.println("GenericReturnType -> " + returntType); // E[][]
        System.out.println();

        // 返回值类型是泛型数组类型
        while(returntType instanceof GenericArrayType){
            GenericArrayType grt = (GenericArrayType)returntType;
            // 第一次循环时 grt 为 E[][]
            // 第二次循环时 grt 为 E[]
            System.out.println("GenericArrayType -> " + grt);
            returntType = grt.getGenericComponentType();
        }
        // 循环结束时 returntType 为 E
        System.out.println("GenericComponentType -> " + returntType); // E
    }
}
